package code;

import java.io.Serializable;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;

public class No implements Serializable {

    private String nome;
    private float custo;
    private NoEstado estado;
    private Map<String, Aresta> listaAresta = new LinkedHashMap<String, Aresta>();
    
    public No(String nome, float custo, NoEstado estado) throws Exception {
        this.setNome(nome);
        this.setCusto(custo);
        this.setEstado(estado);
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) throws Exception {
        if (nome == null || nome.isEmpty()) {
            throw new Exception("O Nó deve possuír um nome válido");
        }
        this.nome = nome;
    }

    public float getCusto() {
        return custo;
    }

    public void setCusto(float custo) {
        this.custo = custo;
    }

    public NoEstado getEstado() {
        return estado;
    }

    public void setEstado(NoEstado estado) {
        this.estado = estado;
    }

    public Aresta getAresta(String nome){
        Aresta aresta = listaAresta.get(nome);        
        return aresta;
    }

    public void addAresta(Aresta aresta) throws Exception {
        Aresta arestaTeste;
        arestaTeste = listaAresta.put(aresta.getNome(), aresta);        
    }

    public void removeAresta(String nome) throws Exception{
        Aresta arestaTeste;
        arestaTeste = listaAresta.remove(nome);       
    }    

    public Map getListaArestas(){
        return listaAresta;
    }

    @Override
    public String toString() {
        return this.nome;
    }
    
    public String getResultado() {
        StringBuilder sb = new StringBuilder();
        sb.append("Nó " + this.nome + " (" + this.estado + ", custo "+ this.custo +")");
        if (this.listaAresta.size() > 0)
            sb.append(" ligado a ");
        else
            sb.append(".");

        Collection<Aresta> arestas = this.listaAresta.values();
        int i = 0;
        for (Aresta aresta: arestas) {            
            sb.append(((i>0 && i<this.listaAresta.size())?", a ":"") + ((this == aresta.getNoEsquerda())?aresta.getNoDireita().getNome():aresta.getNoEsquerda().getNome()));
            sb.append(" por " + aresta.getNome() + ((i == this.listaAresta.size()-1)? ".":""));
            i++;
        }
        return new String(sb);
    }
}